package com.msi.algorithm;

import java.util.ArrayList;
import java.util.List;

import com.msi.Graph;
import com.msi.Vertex;

/**
 * Stół do obsadzenia gośćmi
 * @author Michał Kołodziejski
 */
public class Table {

    protected List<Vertex> sittingGuests;
    
    /**
     * Tworzy nowy pusty stół
     */
    public Table() {
        sittingGuests = new ArrayList<Vertex>();
    }
    
    /**
     * Zwraca informację, czy nowy gość może dosiąść się do tego stołu
     * @param newGuest nowy gość
     * @return informacja, czy nowy gość może dosiąść się do tego stołu
     */
    public boolean maySeatHere(Vertex newGuest){
        if(sittingGuests.size() >= 4){
            return false;
        }
        
        if(sittingGuests.size() == 0){
            return true;
        }
        
        boolean allGuestsKnown = true;
        for(Vertex guest : sittingGuests){
            boolean newGuestKnown = false;
            for(Vertex friend : guest.getNeighborhood()){
                if(friend.equals(newGuest)){
                    newGuestKnown = true;
                    break;
                }
            }
            
            allGuestsKnown = allGuestsKnown && newGuestKnown;
            if(allGuestsKnown == false){
                break;
            }
        }
        
        return allGuestsKnown;
    }
    
    /**
     * Sadza gościa przy tym stole. Wymaga to wcześniejszego sprawdzenia!
     * @param newGuest nowy gość
     */
    public void sitHere(Vertex newGuest){
        sittingGuests.add(newGuest);
    }
    
    /**
     * Zwraca liczbę gości siedzących przy tym stole
     * @return liczba gości siedzących przy tym stole
     */
    public int getNumberOfSittingGuests(){
        return sittingGuests.size();
    }
    
    /**
     * Zwraca kopię stołu z odpowiadającymi wierzchołkami z kopii grafu
     * @param graph kopia grafu
     * @return kopia stołu
     */
    public Table getTableCopy(Graph graph){
        Table tableCopy = new Table();
        for(Vertex guest : sittingGuests){
            tableCopy.sitHere(graph.getVertex(guest.getId()));
        }
        return tableCopy;
    }
    
    /**
     * Zwraca listę gości siedzących przy stole
     * @return lista gości
     */
    public List<Vertex> getListOfSittingGuests(){
        return sittingGuests;
    }
}
